package com.example.socket;

import com.example.entity.SocketEntity;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;

/**
 * 测试websocket连接
 *
 * @author zy
 */

@Component
@ServerEndpoint(value = "/websocket")
public class WebSocketTest {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session) {
        //在线数加1
        int incrementAndGet = SocketEntity.ONLINE_COUNT.incrementAndGet();
        //将当前会话加入set中
        SocketEntity.SESSION_CURRENT_MAP.put(session.getBasicRemote(), session);
        logger.info("有新连接加入！当前在线人数为:{}", incrementAndGet);
        try {
            session.getBasicRemote().sendText("哈喽!");
        } catch (IOException e) {
            logger.error("IO异常:{}", e.getMessage());
        }
    }

    /**
     * 连接关闭调用的方法
     */
    @OnClose
    public void onClose(Session session) {
        logger.info("close,ID:{}", session.getId());
        //从set中删除
        SocketEntity.SESSION_CURRENT_MAP.remove(session.getBasicRemote());
        //在线数减1
        int decrementAndGet = SocketEntity.ONLINE_COUNT.decrementAndGet();
        logger.info("有一连接关闭！当前在线人数为:{}", decrementAndGet);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, Session session) throws IOException {
        logger.info("来自客户端的消息:{}", message);
        //群发消息
        session.getBasicRemote().sendText(message);
    }

    /**
     * 发生错误时调用
     *
     * @param error error
     */
    @OnError
    public void onError(Session session, Throwable error) {
        logger.error("发生错误:{}", error.getMessage());
        error.printStackTrace();
    }


    /**
     * 群发自定义消息
     */
    public static void sendInfo(String message) {
        SocketEntity.SESSION_CURRENT_MAP.forEach((k, v) -> {
            try {
                k.sendText(message);
            } catch (IOException ioException) {
                ioException.printStackTrace();
            }
        });
    }


}
